#include<bits/stdc++.h>
using namespace std;
const int MAXN=200005;
int N,id[MAXN],R[MAXN],now,ans[MAXN];
pair<long long,int> A[MAXN];
int C[MAXN];
void add(int x,int val) {
	for(; x<=N; x+=x&-x)C[x]+=val;
}
int query(int x) {
	int ans=0;
	for(; x; x-=x&-x)
		ans+=C[x];
	return ans;
}
vector<pair<int,long long> > mat[MAXN];
void dfs(int k) {
	id[k]=++now;
	for(auto e:mat[k]) {
		a[e.first]=make_pair(a[k].first+e.second,e.first);
		dfs(e.first);
	}
	r[k]=now;
}
int main() {
	long long l;
	cin>>N>>l;
	for(int i=2; i<=N; i++) {
		int p;
		long long w;
		cin>>p>>w;
		mat[p].push_back(make_pair(i,w));
	}
	A[1]=make_pair(0ll,1);
	dfs(1);
	sort(A+1,A+N+1);
	int j=N;
	for(int i=N; i; i--) {
		for(; A[j].first-A[i].first>l; j--)
			add(id[A[j].second],-1);
		add(id[A[i].second],1);
		ans[A[i].second]=query(R[A[i].second])-query(id[A[i].second]-1);
	}
	for(int i=1; i<=N; i++)
		cout<<ans[i]<<endl;
	return 0;
}
